CVE-2019-0230(S2-059 Apache Struts2 远程代码执行漏洞)分析

Struts2 在处理 OGNL 语言时,会做 OGNL 语法双重解析,即在 OGNL 表达式中再次传入 OGNL 表达式时,同样会再做一次解析。

影响范围:Apache Struts 2.0.0 ~ 2.5.20,我未做那么多版本的测试,以下可以在 2.5.20 中复现。

例如:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
  <head>
    <title>S2-059 test</title>
  </head>
  <body>
    <p>
      <a href="test_execute.action?id=1">test GET method link</a>
    </p>
    <form action="${pageContext.request.contextPath}/test_execute.action" method="post">
      <s:a id="%{id}">test_link</s:a>
      <h1>Value:</h1>
      <s:textfield name="id" value="%{id}"></s:textfield>
      <input type="submit" value="poc">
    </form>
  </body>
</html>

本身 id 就是一个 OGNL 表达式,如果 id 这个变量能被外部控制,那么再传递一个 OGNL 表达式同样能被解析:

id=vul%25{245%2b5}

漏洞环境请见:https://github.com/1u4nx/Vulnerable_Env_Collect/tree/master/CVE-2019-0230%EF%BC%88S2-059%EF%BC%89